home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-17 / mouse.zip / MOUSU.PAS < prev    next >
Pascal/Delphi Source File  |  1991-07-20  |  24KB  |  928 lines

  1. Unit Mousu;
  2.  
  3. Interface
  4.  
  5. Uses Crt,Dos,Video,Binu;
  6.  
  7. Type
  8.     GraphCursMaskType = Record
  9.        Mask : Array [0..1, 0..15] of Word;
  10.        HorzHotSpot,
  11.        VertHotSpot : Integer;
  12.        End;
  13.  
  14. Var
  15.    StandardShapeCurs,
  16.    UpArrowCurs,
  17.    LeftArrowCurs,
  18.    CheckMarkCurs,
  19.    PointingHandCurs,
  20.    DiagnolCrossCurs,
  21.    RectangularCrossCurs,
  22.    GoodGuyCurs,
  23.    HourGlassCurs : GraphCursMaskType;
  24.  
  25.    MouseX,
  26.    MouseY,
  27.    ButtonPressCount,
  28.    ButtonReleasCount,
  29.    TextScrMask,
  30.    TextCursMask : Word;
  31.  
  32.    NumMouseKeys : Byte;
  33.  
  34.    MousePresent : Boolean;
  35.  
  36.    MKey : (None,Left,Right,Both);
  37.  
  38. Procedure ResetMouse;
  39.  
  40. Procedure VirtualScreenSize(Var MaxX,
  41.                                 MaxY,
  42.                                 CellSizeX,
  43.                                 CellSizeY:Word);
  44.  
  45. Procedure ShowMouseCursor;
  46.  
  47. Procedure HideMouseCursor;
  48.  
  49. Procedure GetButtonStatus;
  50.  
  51. Procedure SetMouseCursorPos(x,y : Word);
  52.  
  53. Procedure GetButtonPressInfo(KeyNum : Word);
  54.  
  55. Procedure SetMinMaxHorzCursPos(Min,Max: Word);
  56.  
  57. Procedure SetMinMaxVertCursPos(Min,Max: Word);
  58.  
  59. Procedure SetGraphicsCursor(Var Mask: GraphCursMaskType);
  60.  
  61. Procedure SetSoftTextCursor(TextScrMask,
  62.                             TextCursMask : Word);
  63.  
  64. Procedure SetHardTextCursorBig;
  65.  
  66. Procedure SetHardTextCursorSmall;
  67.  
  68. Procedure ReadMouseMotionCounters(Var Hcount,
  69.                                       Vcount: Word);
  70.  
  71. Procedure LightPenEmulOn;
  72.  
  73. Procedure LightPenEmulOff;
  74.  
  75. Procedure SetMickeyToPixels(HRatio,VRatio : Word);
  76.  
  77. Procedure ConditionalOff(x1,y1,x2,y2 : Word);
  78.  
  79. Procedure SetDoubleSpeed(Speed : Word);
  80.  
  81. Procedure SaveMouseDriverState;
  82.  
  83. Procedure RestoreMouseDriverState;
  84.  
  85. Procedure SetCrtPageNumber(Page : Word);
  86.  
  87. Procedure GetCrtPageNumber(Var Page : word);
  88.  
  89. Function AnyMouseKeyPressed : Boolean;
  90.  
  91. Function LeftMouseKeyPressed : Boolean;
  92.  
  93. Function RightMouseKeyPressed : Boolean;
  94.  
  95. Function BothMouseKeysPressed : Boolean;
  96.  
  97. Implementation
  98.  
  99. Const
  100.      MouseDelay = 0;
  101. Var
  102.    MouseSaveBuffer : Pointer;
  103.    MKP,
  104.    MouseVisible : Boolean;
  105.    MouseBufferSize: Word;
  106.  
  107.    Regs : Registers;
  108.  
  109. Procedure DefineStandardShape;
  110. Begin
  111. With StandardShapeCurs Do
  112.      Begin
  113.      Mask[0,0] := BinToWord('0011111111111111');
  114.      Mask[0,1] := BinToWord('0001111111111111');
  115.      Mask[0,2] := BinToWord('0000111111111111');
  116.      Mask[0,3] := BinToWord('0000011111111111');
  117.      Mask[0,4] := BinToWord('0000001111111111');
  118.      Mask[0,5] := BinToWord('0000000111111111');
  119.      Mask[0,6] := BinToWord('0000000011111111');
  120.      Mask[0,7] := BinToWord('0000000001111111');
  121.      Mask[0,8] := BinToWord('0000000000111111');
  122.      Mask[0,9] := BinToWord('0000000000011111');
  123.      Mask[0,10]:= BinToWord('0000000111111111');
  124.      Mask[0,11]:= BinToWord('0001000011111111');
  125.      Mask[0,12]:= BinToWord('0011000011111111');
  126.      Mask[0,13]:= BinToWord('1111100001111111');
  127.      Mask[0,14]:= BinToWord('1111100001111111');
  128.      Mask[0,15]:= BinToWord('1111110000111111');
  129.  
  130.      Mask[1,0] := BinToWord('0000000000000000');
  131.      Mask[1,1] := BinToWord('0100000000000000');
  132.      Mask[1,2] := BinToWord('0110000000000000');
  133.      Mask[1,3] := BinToWord('0111000000000000');
  134.      Mask[1,4] := BinToWord('0111100000000000');
  135.      Mask[1,5] := BinToWord('0111110000000000');
  136.      Mask[1,6] := BinToWord('0111111000000000');
  137.      Mask[1,7] := BinToWord('0111111100000000');
  138.      Mask[1,8] := BinToWord('0111111110000000');
  139.      Mask[1,9] := BinToWord('0111111111000000');
  140.      Mask[1,10]:= BinToWord('0111110000000000');
  141.      Mask[1,11]:= BinToWord('0100011000000000');
  142.      Mask[1,12]:= BinToWord('0000011000000000');
  143.      Mask[1,13]:= BinToWord('0000001100000000');
  144.      Mask[1,14]:= BinToWord('0000001100000000');
  145.      Mask[1,15]:= BinToWord('0000000110000000');
  146.  
  147.      HorzHotSpot := -1;
  148.      VertHotSpot := -1;
  149.      End;
  150. End;
  151.  
  152.  
  153. Procedure DefineUpArrow;
  154. Begin
  155. With UpArrowCurs Do
  156.      Begin
  157.      Mask[0,0] := BinToWord('1111100111111111');
  158.      Mask[0,1] := BinToWord('1111000011111111');
  159.      Mask[0,2] := BinToWord('1110000001111111');
  160.      Mask[0,3] := BinToWord('1110000001111111');
  161.      Mask[0,4] := BinToWord('1100000000111111');
  162.      Mask[0,5] := BinToWord('1100000000111111');
  163.      Mask[0,6] := BinToWord('1000000000011111');
  164.      Mask[0,7] := BinToWord('1000000000011111');
  165.      Mask[0,8] := BinToWord('0000000000001111');
  166.      Mask[0,9] := BinToWord('0000000000001111');
  167.      Mask[0,10]:= BinToWord('1111000011111111');
  168.      Mask[0,11]:= BinToWord('1111000011111111');
  169.      Mask[0,12]:= BinToWord('1111000011111111');
  170.      Mask[0,13]:= BinToWord('1111000011111111');
  171.      Mask[0,14]:= BinToWord('1111000011111111');
  172.      Mask[0,15]:= BinToWord('1111000011111111');
  173.  
  174.      Mask[1,0] := BinToWord('0000000000000000');
  175.      Mask[1,1] := BinToWord('0000011000000000');
  176.      Mask[1,2] := BinToWord('0000111100000000');
  177.      Mask[1,3] := BinToWord('0000111100000000');
  178.      Mask[1,4] := BinToWord('0001111110000000');
  179.      Mask[1,5] := BinToWord('0001111110000000');
  180.      Mask[1,6] := BinToWord('0011111111000000');
  181.      Mask[1,7] := BinToWord('0011111111000000');
  182.      Mask[1,8] := BinToWord('0111111111100000');
  183.      Mask[1,9] := BinToWord('0000011000000000');
  184.      Mask[1,10]:= BinToWord('0000011000000000');
  185.      Mask[1,11]:= BinToWord('0000011000000000');
  186.      Mask[1,12]:= BinToWord('0000011000000000');
  187.      Mask[1,13]:= BinToWord('0000011000000000');
  188.      Mask[1,14]:= BinToWord('0000011000000000');
  189.      Mask[1,15]:= BinToWord('0000000000000000');
  190.  
  191.      HorzHotSpot := 5;
  192.      VertHotSpot := 0;
  193.      end;
  194. End;
  195.  
  196.  
  197.  
  198. Procedure DefineLeftArrow;
  199. Begin
  200. With LeftArrowCurs do
  201.      Begin
  202.      Mask[0,0] := BinToWord('1111111000011111');
  203.      Mask[0,1] := BinToWord('1111000000011111');
  204.      Mask[0,2] := BinToWord('0000000000000000');
  205.      Mask[0,3] := BinToWord('0000000000000000');
  206.      Mask[0,4] := BinToWord('0000000000000000');
  207.      Mask[0,5] := BinToWord('1111000000011111');
  208.      Mask[0,6] := BinToWord('1111111000011111');
  209.      Mask[0,7] := BinToWord('1111111111111111');
  210.      Mask[0,8] := BinToWord('1111111111111111');
  211.      Mask[0,9] := BinToWord('1111111111111111');
  212.      Mask[0,10]:= BinToWord('1111111111111111');
  213.      Mask[0,11]:= BinToWord('1111111111111111');
  214.      Mask[0,12]:= BinToWord('1111111111111111');
  215.      Mask[0,13]:= BinToWord('1111111111111111');
  216.      Mask[0,14]:= BinToWord('1111111111111111');
  217.      Mask[0,15]:= BinToWord('1111111111111111');
  218.  
  219.      Mask[1,0] := BinToWord('0000000000000000');
  220.      Mask[1,1] := BinToWord('0000000011000000');
  221.      Mask[1,2] := BinToWord('0000011111000000');
  222.      Mask[1,3] := BinToWord('0111111111111110');
  223.      Mask[1,4] := BinToWord('0000011111000000');
  224.      Mask[1,5] := BinToWord('0000000011000000');
  225.      Mask[1,6] := BinToWord('0000000000000000');
  226.      Mask[1,7] := BinToWord('0000000000000000');
  227.      Mask[1,8] := BinToWord('0000000000000000');
  228.      Mask[1,9] := BinToWord('0000000000000000');
  229.      Mask[1,10]:= BinToWord('0000000000000000');
  230.      Mask[1,11]:= BinToWord('0000000000000000');
  231.      Mask[1,12]:= BinToWord('0000000000000000');
  232.      Mask[1,13]:= BinToWord('0000000000000000');
  233.      Mask[1,14]:= BinToWord('0000000000000000');
  234.      Mask[1,15]:= BinToWord('0000000000000000');
  235.  
  236.      HorzHotSpot := 0;
  237.      VertHotSpot := 3;
  238.      End;
  239. End;
  240.  
  241.  
  242.  
  243. Procedure DefineCheckMark;
  244. Begin
  245. With CheckMarkCurs Do
  246. Begin
  247.      Mask[0,0] := BinToWord('1111111111110000');
  248.      Mask[0,1] := BinToWord('1111111111100000');
  249.      Mask[0,2] := BinToWord('1111111111000000');
  250.      Mask[0,3] := BinToWord('1111111110000001');
  251.      Mask[0,4] := BinToWord('1111111100000011');
  252.      Mask[0,5] := BinToWord('0000011000000111');
  253.      Mask[0,6] := BinToWord('0000000000001111');
  254.      Mask[0,7] := BinToWord('0000000000011111');
  255.      Mask[0,8] := BinToWord('1100000000111111');
  256.      Mask[0,9] := BinToWord('1111000001111111');
  257.      Mask[0,10]:= BinToWord('1111111111111111');
  258.      Mask[0,11]:= BinToWord('1111111111111111');
  259.      Mask[0,12]:= BinToWord('1111111111111111');
  260.      Mask[0,13]:= BinToWord('1111111111111111');
  261.      Mask[0,14]:= BinToWord('1111111111111111');
  262.      Mask[0,15]:= BinToWord('1111111111111111');
  263.  
  264.      Mask[1,0] := BinToWord('0000000000000000');
  265.      Mask[1,1] := BinToWord('0000000000000110');
  266.      Mask[1,2] := BinToWord('0000000000001100');
  267.      Mask[1,3] := BinToWord('0000000000011000');
  268.      Mask[1,4] := BinToWord('0000000000110000');
  269.      Mask[1,5] := BinToWord('0000000001100000');
  270.      Mask[1,6] := BinToWord('0111000011000000');
  271.      Mask[1,7] := BinToWord('0001110110000000');
  272.      Mask[1,8] := BinToWord('0000011100000000');
  273.      Mask[1,9] := BinToWord('0000000000000000');
  274.      Mask[1,10]:= BinToWord('0000000000000000');
  275.      Mask[1,11]:= BinToWord('0000000000000000');
  276.      Mask[1,12]:= BinToWord('0000000000000000');
  277.      Mask[1,13]:= BinToWord('0000000000000000');
  278.      Mask[1,14]:= BinToWord('0000000000000000');
  279.      Mask[1,15]:= BinToWord('0000000000000000');
  280.      HorzHotSpot := 6;
  281.      VertHotSpot := 7;
  282.      End;
  283. End;
  284.  
  285.  
  286. Procedure DefinePointingHand;
  287. Begin
  288. With PointingHandCurs Do
  289. Begin
  290.      Mask[0,0] := BinToWord('1110000111111111');
  291.      Mask[0,1] := BinToWord('1110000111111111');
  292.      Mask[0,2] := BinToWord('1110000111111111');
  293.      Mask[0,3] := BinToWord('1110000111111111');
  294.      Mask[0,4] := BinToWord('1110000111111111');
  295.      Mask[0,5] := BinToWord('1110000000000000');
  296.      Mask[0,6] := BinToWord('1110000000000000');
  297.      Mask[0,7] := BinToWord('1110000000000000');
  298.      Mask[0,8] := BinToWord('0000000000000000');
  299.      Mask[0,9] := BinToWord('0000000000000000');
  300.      Mask[0,10]:= BinToWord('0000000000000000');
  301.      Mask[0,11]:= BinToWord('0000000000000000');
  302.      Mask[0,12]:= BinToWord('0000000000000000');
  303.      Mask[0,13]:= BinToWord('0000000000000000');
  304.      Mask[0,14]:= BinToWord('0000000000000000');
  305.      Mask[0,15]:= BinToWord('0000000000000000');
  306.  
  307.      Mask[1,0] := BinToWord('0001111000000000');
  308.      Mask[1,1] := BinToWord('0001001000000000');
  309.      Mask[1,2] := BinToWord('0001001000000000');
  310.      Mask[1,3] := BinToWord('0001001000000000');
  311.      Mask[1,4] := BinToWord('0001001000000000');
  312.      Mask[1,5] := BinToWord('0001001111111111');
  313.      Mask[1,6] := BinToWord('0001001001001001');
  314.      Mask[1,7] := BinToWord('0001001001001001');
  315.      Mask[1,8] := BinToWord('1111001001001001');
  316.      Mask[1,9] := BinToWord('1001000000000001');
  317.      Mask[1,10]:= BinToWord('1001000000000001');
  318.      Mask[1,11]:= BinToWord('1001000000000001');
  319.      Mask[1,12]:= BinToWord('1000000000000001');
  320.      Mask[1,13]:= BinToWord('1000000000000001');
  321.      Mask[1,14]:= BinToWord('1000000000000001');
  322.      Mask[1,15]:= BinToWord('1111111111111111');
  323.  
  324.      HorzHotSpot := 5;
  325.      VertHotSpot := 0;
  326.      end;
  327. End;
  328.  
  329.  
  330. Procedure DefineDiagonalCross;
  331. Begin
  332. With DiagnolCrossCurs Do
  333. Begin
  334.      Mask[0,0] := BinToWord('0000011111100000');
  335.      Mask[0,1] := BinToWord('0000000110000000');
  336.      Mask[0,2] := BinToWord('0000000000000000');
  337.      Mask[0,3] := BinToWord('1100000000000011');
  338.      Mask[0,4] := BinToWord('1111000000001111');
  339.      Mask[0,5] := BinToWord('1100000000000011');
  340.      Mask[0,6] := BinToWord('0000000000000000');
  341.      Mask[0,7] := BinToWord('0000000110000000');
  342.      Mask[0,8] := BinToWord('0000001111000000');
  343.      Mask[0,9] := BinToWord('1111111111111111');
  344.      Mask[0,10]:= BinToWord('1111111111111111');
  345.      Mask[0,11]:= BinToWord('1111111111111111');
  346.      Mask[0,12]:= BinToWord('1111111111111111');
  347.      Mask[0,13]:= BinToWord('1111111111111111');
  348.      Mask[0,14]:= BinToWord('1111111111111111');
  349.      Mask[0,15]:= BinToWord('1111111111111111');
  350.  
  351.      Mask[1,0] := BinToWord('0000000000000000');
  352.      Mask[1,1] := BinToWord('0111000000001110');
  353.      Mask[1,2] := BinToWord('0001110000111000');
  354.      Mask[1,3] := BinToWord('0000011001100000');
  355.      Mask[1,4] := BinToWord('0000001111000000');
  356.      Mask[1,5] := BinToWord('0000011001100000');
  357.      Mask[1,6] := BinToWord('0001110000111000');
  358.      Mask[1,7] := BinToWord('0111000000001110');
  359.      Mask[1,8] := BinToWord('0000000000000000');
  360.      Mask[1,9] := BinToWord('0000000000000000');
  361.      Mask[1,10]:= BinToWord('0000000000000000');
  362.      Mask[1,11]:= BinToWord('0000000000000000');
  363.      Mask[1,12]:= BinToWord('0000000000000000');
  364.      Mask[1,13]:= BinToWord('0000000000000000');
  365.      Mask[1,14]:= BinToWord('0000000000000000');
  366.      Mask[1,15]:= BinToWord('0000000000000000');
  367.  
  368.      HorzHotSpot := 7;
  369.      VertHotSpot := 4;
  370.      End;
  371. End;
  372.  
  373.  
  374. Procedure DefineRectangularCross;
  375. Begin
  376. With RectangularCrossCurs Do
  377. Begin
  378.      Mask[0,1] := BinToWord('1111110000111111');
  379.      Mask[0,1] := BinToWord('1111110000111111');
  380.      Mask[0,2] := BinToWord('1111110000111111');
  381.      Mask[0,3] := BinToWord('0000000000000000');
  382.      Mask[0,4] := BinToWord('0000000000000000');
  383.      Mask[0,5] := BinToWord('0000000000000000');
  384.      Mask[0,6] := BinToWord('1111110000111111');
  385.      Mask[0,7] := BinToWord('1111110000111111');
  386.      Mask[0,8] := BinToWord('1111110000111111');
  387.      Mask[0,9] := BinToWord('1111111111111111');
  388.      Mask[0,10]:= BinToWord('1111111111111111');
  389.      Mask[0,11]:= BinToWord('1111111111111111');
  390.      Mask[0,12]:= BinToWord('1111111111111111');
  391.      Mask[0,13]:= BinToWord('1111111111111111');
  392.      Mask[0,14]:= BinToWord('1111111111111111');
  393.      Mask[0,15]:= BinToWord('1111111111111111');
  394.  
  395.      Mask[1,1] := BinToWord('0000000000000000');
  396.      Mask[1,0] := BinToWord('0000000110000000');
  397.      Mask[1,2] := BinToWord('0000000110000000');
  398.      Mask[1,3] := BinToWord('0000000110000000');
  399.      Mask[1,4] := BinToWord('1111111111111111');
  400.      Mask[1,5] := BinToWord('0000000110000000');
  401.      Mask[1,6] := BinToWord('0000000110000000');
  402.      Mask[1,7] := BinToWord('0000000110000000');
  403.      Mask[1,8] := BinToWord('0000000000000000');
  404.      Mask[1,9] := BinToWord('0000000000000000');
  405.      Mask[1,10]:= BinToWord('0000000000000000');
  406.      Mask[1,11]:= BinToWord('0000000000000000');
  407.      Mask[1,12]:= BinToWord('0000000000000000');
  408.      Mask[1,13]:= BinToWord('0000000000000000');
  409.      Mask[1,14]:= BinToWord('0000000000000000');
  410.      Mask[1,15]:= BinToWord('0000000000000000');
  411.  
  412.      HorzHotSpot := 7;
  413.      VertHotSpot := 4;
  414.      End;
  415. End;
  416.  
  417. Procedure DefineGoodGuy;
  418. Begin
  419. With GoodGuyCurs Do
  420.      Begin
  421.      Mask[0,0] := BinToWord('1111000000001111');
  422.      Mask[0,1] := BinToWord('1100000000000011');
  423.      Mask[0,2] := BinToWord('1000000000000001');
  424.      Mask[0,3] := BinToWord('1000010000100001');
  425.      Mask[0,4] := BinToWord('0000100000010000');
  426.      Mask[0,5] := BinToWord('0000000000000000');
  427.      Mask[0,6] := BinToWord('0000000000000000');
  428.      Mask[0,7] := BinToWord('0000000000000000');
  429.      Mask[0,8] := BinToWord('0000000000000000');
  430.      Mask[0,9] := BinToWord('0000000000000000');
  431.      Mask[0,10]:= BinToWord('0000000000000000');
  432.      Mask[0,11]:= BinToWord('0000100000010000');
  433.      Mask[0,11]:= BinToWord('1000010000100001');
  434.      Mask[0,13]:= BinToWord('1000000000000001');
  435.      Mask[0,14]:= BinToWord('1100000000000011');
  436.      Mask[0,15]:= BinToWord('1111000000001111');
  437.  
  438.      Mask[1,0] := BinToWord('0000001111000000');
  439.      Mask[1,1] := BinToWord('0000111111110000');
  440.      Mask[1,2] := BinToWord('0011100000011100');
  441.      Mask[1,3] := BinToWord('0011001111001100');
  442.      Mask[1,4] := BinToWord('0110000110000110');
  443.      Mask[1,5] := BinToWord('0110010110100110');
  444.      Mask[1,6] := BinToWord('1100001111000011');
  445.      Mask[1,7] := BinToWord('1101111111111011');
  446.      Mask[1,8] := BinToWord('1101111111111011');
  447.      Mask[1,9] := BinToWord('1100001111000011');
  448.      Mask[1,10]:= BinToWord('0110010110100110');
  449.      Mask[1,11]:= BinToWord('0110000110000110');
  450.      Mask[1,12]:= BinToWord('0011001111001100');
  451.      Mask[1,13]:= BinToWord('0011100000011100');
  452.      Mask[1,14]:= BinToWord('0000111111110000');
  453.      Mask[1,15]:= BinToWord('0000001111000000');
  454.  
  455.      HorzHotSpot := 8;
  456.      VertHotSpot := 8;
  457.      End;
  458. End;
  459.  
  460. Procedure DefineHourGlass;
  461. Begin
  462. With HourGlassCurs Do
  463. Begin
  464.      Mask[0,1] := BinToWord('0000000000000000');
  465.      Mask[0,0] := BinToWord('0000000000000000');
  466.      Mask[0,2] := BinToWord('0000000000000000');
  467.      Mask[0,3] := BinToWord('0000000000000000');
  468.      Mask[0,4] := BinToWord('1000000000000001');
  469.      Mask[0,5] := BinToWord('1100000000000011');
  470.      Mask[0,6] := BinToWord('1110000000000111');
  471.      Mask[0,7] := BinToWord('1111000000001111');
  472.      Mask[0,8] := BinToWord('1110000000000111');
  473.      Mask[0,9] := BinToWord('1100000000000011');
  474.      Mask[0,10]:= BinToWord('1000000000000001');
  475.      Mask[0,11]:= BinToWord('0000000000000000');
  476.      Mask[0,12]:= BinToWord('0000000000000000');
  477.      Mask[0,13]:= BinToWord('0000000000000000');
  478.      Mask[0,14]:= BinToWord('0000000000000000');
  479.      Mask[0,15]:= BinToWord('1111111111111111');
  480.  
  481.      Mask[1,1] := BinToWord('0000000000000000');
  482.      Mask[1,0] := BinToWord('0111111111111110');
  483.      Mask[1,2] := BinToWord('0110000000000110');
  484.      Mask[1,3] := BinToWord('0011000000001100');
  485.      Mask[1,4] := BinToWord('0001100000011000');
  486.      Mask[1,5] := BinToWord('0000110000110000');
  487.      Mask[1,6] := BinToWord('0000011001100000');
  488.      Mask[1,7] := BinToWord('0000001111000000');
  489.      Mask[1,8] := BinToWord('0000011001100000');
  490.      Mask[1,9] := BinToWord('0000110000110000');
  491.      Mask[1,10]:= BinToWord('0001100000011000');
  492.      Mask[1,11]:= BinToWord('0011000000001100');
  493.      Mask[1,12]:= BinToWord('0110000000000110');
  494.      Mask[1,13]:= BinToWord('0111111111111110');
  495.      Mask[1,14]:= BinToWord('0000000000000000');
  496.      Mask[1,15]:= BinToWord('0000000000000000');
  497.  
  498.      HorzHotSpot := 7;
  499.      VertHotSpot := 7;
  500.      End;
  501. End;
  502.  
  503. Procedure SetKeyStatus(MStatus : Word);
  504. Begin
  505.      Case MStatus of
  506.      0: Mkey := None;
  507.      1: Mkey := Left;
  508.      2: Mkey := Right;
  509.      3: Mkey := Both;
  510.      End;
  511. End;
  512.  
  513.  
  514.  
  515. Procedure ResetMouse;
  516. Begin
  517. Regs.AX := 0;
  518. Intr($33,Regs);
  519. With Regs do
  520.      Begin
  521.      MousePresent := AX > 0;
  522.      If MousePresent Then
  523.         NumMouseKeys := BX
  524.      Else
  525.          NumMouseKeys := 0;
  526.      End;
  527. MouseVisible := False;
  528. End;
  529.  
  530.  
  531.  
  532. Procedure VirtualScreenSize(Var MaxX,
  533.                                 MaxY,
  534.                                 CellSizeX,
  535.                                 CellSizeY : Word);
  536. Begin
  537. Regs.AH := $0F;
  538. Intr($10,Regs);
  539.  
  540.     Case Regs.AL Of
  541.  
  542.     0, 1:
  543.        begin
  544.        MaxX     := 640;
  545.        MaxY     := 200;
  546.        CellSizeX:= 16;
  547.        CellSizeY:= 8;
  548.        End;
  549.  
  550.     2, 3, 7:
  551.        Begin
  552.        MaxX     := 640;
  553.        MaxY     := 200;
  554.        CellSizeX:= 8;
  555.        CellSizeY:= 8;
  556.        End;
  557.  
  558.     4, 5:
  559.        Begin
  560.        MaxX     := 640;
  561.        MaxY     := 200;
  562.        CellSizeX:= 2;
  563.        CellSizeY:= 1;
  564.        End;
  565.  
  566.     6:
  567.       Begin
  568.       MaxX      := 640;
  569.       Maxy      := 200;
  570.       CellSizeX := 1;
  571.       CellSizeY := 1;
  572.       End;
  573.  
  574.     13:
  575.        Begin
  576.        MaxX     := 640;
  577.        MaxY     := 200;
  578.        CellSizeX:= 16;
  579.        CellSizeY:= 8;
  580.        End;
  581.  
  582.     14, 15:
  583.         Begin
  584.         MaxX    := 640;
  585.         MaxY    := 350;
  586.         CellSizeX:= 1;
  587.         CellSizeY:= 1;
  588.         End;
  589.  
  590.     End;
  591. End;
  592.  
  593.  
  594. Procedure ShowMouseCursor;
  595. Begin
  596. If Not  MouseVisible Then
  597.    Begin
  598.    Regs.AX := 1;
  599.    Intr($33,Regs);
  600.    MouseVisible := True;
  601.    End;
  602. End;
  603.  
  604.  
  605. Procedure HideMouseCursor;
  606. Begin
  607. If MouseVisible Then
  608.    Begin
  609.    Regs.AX := 2;
  610.    Intr($33, Regs);
  611.    MouseVisible := False;
  612.    End;
  613. End;
  614.  
  615.  
  616. Procedure GetButtonStatus;
  617. Begin
  618. Regs. AX := 3;
  619. Intr($33,Regs);
  620. With Regs Do
  621.      Begin
  622.      SetKeyStatus(BX);
  623.      MouseX := CX;
  624.      MouseY := DX;
  625.      End;
  626. End;
  627.  
  628.  
  629. Procedure SetMouseCursorPos(x, y : Word);
  630. Begin
  631. With Regs Do
  632.      Begin
  633.      AX := 4;
  634.      CX := x;
  635.      DX := y;
  636.      End;
  637.  
  638. Intr($33,Regs);
  639. MouseX := x;
  640. MouseY := y;
  641. End;
  642.  
  643.  
  644. Procedure GetButtonPressInfo(Keynum : Word);
  645. Begin
  646. With Regs Do
  647.      Begin
  648.      AX := 5;
  649.      BX := Keynum -1;
  650.      End;
  651. Intr($33, Regs);
  652. With Regs Do
  653.      Begin
  654.      SetKeyStatus(AX);
  655.      ButtonPressCount := BX;
  656.      MouseX := CX;
  657.      MouseY := DX;
  658.      End;
  659. End;
  660.  
  661.  
  662. Procedure SetMinMaxHorzCursPos(Min, Max: Word);
  663. Begin
  664. With Regs Do
  665.      Begin
  666.      AX := 7;
  667.      CX := Min;
  668.      DX := Max;
  669.      End;
  670. Intr($33, Regs);
  671. End;
  672.  
  673.  
  674. Procedure SetMinMaxVertCursPos(Min, Max: Word);
  675. Begin
  676. With Regs Do
  677.      Begin
  678.      AX := 8;
  679.      CX := Min;
  680.      DX := Max;
  681.      End;
  682. Intr($33,Regs);
  683. End;
  684.  
  685.  
  686. Procedure SetGraphicsCursor(Var Mask: GraphCursMaskType);
  687. Begin
  688. With Regs Do
  689.      Begin
  690.      AX := 9;
  691.      BX := Word(Mask.HorzHotSpot);
  692.      CX := Word(Mask.VertHotSpot);
  693.      DX := Ofs(Mask);
  694.      ES := Seg(Mask);
  695.      End;
  696. Intr($33,Regs);
  697. End;
  698.  
  699.  
  700. Procedure SetSoftTextCursor( TextScrMask,
  701.                              TextCursMask : Word);
  702. Begin
  703. With Regs Do
  704.      Begin
  705.      AX := 10;
  706.      BX := 0;
  707.      CX := TextScrMask;
  708.      DX := TextCursMask;
  709.      End;
  710. Intr($33,Regs);
  711. End;
  712.  
  713.  
  714. Procedure SetHardTextCursorBig;
  715. Begin
  716. With Regs Do
  717.      Begin
  718.      AX := 10;
  719.      BX := 1;
  720.      If Stype = Mono Then
  721.         Begin
  722.         CX := 0;
  723.         DX := 13;
  724.         End
  725.      Else
  726.          Begin
  727.          CX := 0;
  728.          DX := 7;
  729.          End;
  730.      End;
  731. Intr($33,Regs);
  732. End;
  733.  
  734.  
  735. Procedure SetHardTextCursorSmall;
  736. Begin
  737. With Regs Do
  738.      Begin
  739.      AX := 10;
  740.      BX := 1;
  741.      If Stype = Mono Then
  742.         Begin
  743.         CX := 12;
  744.         DX := 13;
  745.         End
  746.      Else
  747.          Begin
  748.          CX := 6;
  749.          DX := 7;
  750.          End;
  751.      End;
  752. Intr($33,Regs);
  753. End;
  754.  
  755.  
  756. Procedure ReadMouseMotionCounters(Var Hcount,
  757.                                       Vcount: word);
  758. Begin
  759. Regs.AX := 11;
  760. Intr($33,Regs);
  761. With Regs Do
  762.      Begin
  763.      Hcount := CX;
  764.      Vcount := DX;
  765.      End;
  766. end;
  767.  
  768.  
  769. Procedure LightPenEmulOn;
  770. Begin
  771. Regs.AX := 13;
  772. Intr($33,Regs);
  773. End;
  774.  
  775.  
  776. Procedure LightPenEmulOff;
  777. Begin
  778. Regs.AX := 14;
  779. Intr($33,Regs);
  780. End;
  781.  
  782.  
  783. Procedure SetMickeyToPixels(HRatio, VRatio : Word);
  784. Begin
  785. With Regs Do
  786.      Begin
  787.      AX := 15;
  788.      CX := HRatio;
  789.      DX := VRatio;
  790.      End;
  791. Intr($33,Regs);
  792. End;
  793.  
  794.  
  795. Procedure ConditionalOff(x1, y1, x2, y2 : Word);
  796. Begin
  797. With Regs Do
  798.      Begin
  799.      AX := 16;
  800.      CX := x1;
  801.      DX := y1;
  802.      SI := x2;
  803.      DI := y2;
  804.      End;
  805. Intr($33,Regs);
  806. End;
  807.  
  808.  
  809. Procedure SetDoubleSpeed(Speed : Word);
  810. Begin
  811. With Regs Do
  812.      Begin
  813.      AX := 19;
  814.      DX := Speed;
  815.      End;
  816. Intr($33, Regs);
  817. End;
  818.  
  819.  
  820. Procedure GetMouseSaveSize;
  821. Begin
  822. Regs.AX := 21;
  823. Intr($33,Regs);
  824. MouseBufferSize := Regs.BX;
  825. End;
  826.  
  827.  
  828. Procedure SaveMouseDriverState;
  829. Begin
  830. GetMem(MouseSaveBuffer,MouseBufferSize);
  831. With Regs Do
  832.      Begin
  833.      AX := 22;
  834.      DX := Ofs(MouseSaveBuffer^);
  835.      ES := Seg(MouseSaveBuffer^);
  836.      End;
  837. Intr($33,Regs);
  838. End;
  839.  
  840.  
  841. Procedure RestoreMouseDriverState;
  842. Begin
  843. With Regs Do
  844.      Begin
  845.      AX := 23;
  846.      DX := Ofs(MouseSaveBuffer^);
  847.      ES := Seg(MouseSaveBuffer^);
  848.      End;
  849. Intr($33,Regs);
  850. FreeMem(MouseSaveBuffer,MouseBufferSize);
  851. End;
  852.  
  853.  
  854. Procedure SetCrtPageNumber(Page : Word);
  855. Begin
  856. With Regs Do
  857.      Begin
  858.      AX := 29;
  859.      BX := page;
  860.      End;
  861. Intr($33,Regs);
  862. End;
  863.  
  864.  
  865. Procedure GetCrtPageNumber(Var Page: Word);
  866. Begin
  867. Regs.AX := 23;
  868. Intr($33,Regs);
  869. Page := Regs.BX;
  870. End;
  871.  
  872.  
  873. Function AnyMouseKeyPressed : Boolean;
  874. Begin
  875. If MKP Then
  876.    Delay(MouseDelay);
  877. GetButtonStatus;
  878. MKP := Mkey <> None;
  879. AnyMouseKeyPressed := MKP;
  880. End;
  881.  
  882.  
  883. Function LeftMouseKeyPressed : Boolean;
  884. Begin
  885. If MKP Then
  886.    Delay(MouseDelay);
  887. GetButtonStatus;
  888. MKP := Mkey = Left;
  889. LeftMouseKeyPressed := MKP;
  890. End;
  891.  
  892.  
  893. Function RightMouseKeyPressed : Boolean;
  894. Begin
  895. If MKP Then
  896.    Delay(MouseDelay);
  897. GetButtonStatus;
  898. MKP := Mkey = Right;
  899. RightMouseKeyPressed := MKP;
  900. End;
  901.  
  902.  
  903. Function BothMouseKeysPressed : Boolean;
  904. Begin
  905. If MKP Then
  906.    Delay(MouseDelay);
  907. GetButtonStatus;
  908. MKP := Mkey = Both;
  909. BothMouseKeysPressed := MKP;
  910. End;
  911.  
  912.  
  913. Begin
  914. ResetMouse;
  915. DefineStandardShape;
  916. DefineUpArrow;
  917. DefineLeftArrow;
  918. DefineCheckMark;
  919. DefinePointingHand;
  920. DefineDiagonalCross;
  921. DefineRectangularCross;
  922. DefineGoodGuy;
  923. DefineHourGlass;
  924. MKP := False;
  925. End.
  926.  
  927.  
  928.